package net.chenlin.dp.modules.business.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.exception.ExcelDataConvertException;
import net.chenlin.dp.common.exception.RRException;
import net.chenlin.dp.modules.business.entity.TerminalSimEntity;
import net.chenlin.dp.modules.business.service.DataImportService;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Yangsm
 * @ClassName: SysCaseServiceImportExcelListener
 * @Description: TODO
 * @date 2022年10月26日 11:16
 */
public class SysCaseServiceImportExcelListener extends AnalysisEventListener<TerminalSimEntity> {

    DataImportService dataImportService;

    public SysCaseServiceImportExcelListener(DataImportService dataImportService) {
        this.dataImportService = dataImportService;
    }

    /**
     * 用于暂时存储数据
     */
    private List<TerminalSimEntity> datas = new ArrayList<>(3000);

    /**
     * 每隔3000条存储数据库，然后清理list，方便内存回收 具体条数按实际情况确定
     */
    private static final int BATCH_COUNT = 3000;

    /**
     * 记录行数 第一行为表头
     */
    int row = 1;

    /**
     * 在转换异常 获取其他异常下会调用本接口。抛出异常则停止读取。如果这里不抛出异常则 继续读取下一行。
     *
     * @param exception
     * @param context
     * @throws Exception ExcelAnalysisException
     */
    @Override
    public void onException(Exception exception, AnalysisContext context) throws Exception {
        System.out.println("解析失败===" + exception.getMessage());

        //如果是某一个单元格的转换异常 能获取到具体行号,如果要获取头的信息 配合invokeHeadMap使用
        if (exception instanceof ExcelDataConvertException) {
            ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException) exception;
            throw new RRException("第 " + excelDataConvertException.getRowIndex() + " 行，第 " + excelDataConvertException.getColumnIndex() + " 列解析异常");
        }
        //若不抛异常 则会继续解析下一行
        throw exception;
    }

    @Override
    public void invoke(TerminalSimEntity terminalSimEntity, AnalysisContext analysisContext) {
        //第一行为表头
        row++;
        if (terminalSimEntity.getTerminalId().length() > 6) {
            throw new RRException("第 " + row + " 行:用户名：" + terminalSimEntity.getTerminalId() + " 格式错误,字数大于6个");
        }
        datas.add(terminalSimEntity);
        if (datas.size() >= BATCH_COUNT) {
            saveData();
            datas.clear();
        }
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        saveData();
        //解析结束销毁不用的资源
        datas.clear();
    }

    /**
     * 存储数据库 具体逻辑处理 ================================================================================
     */

    private void saveData() {
        //循环遍历打印出了数据就证明导入数据成功了！
        if (datas != null && datas.size() > 0) {
            for (TerminalSimEntity data : datas) {
                System.out.println("数据-----------------"+data);
            }
        }
        //然后就可以实现将数据存储到数据库中了！
        dataImportService.insertListData(datas);
    }

}
